package br.senai.sc.web.paginaInicial.beans;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.enterprise.context.SessionScoped;
import javax.inject.Inject;
import javax.inject.Named;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.entity.StandardEntityCollection;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.plot.PiePlot;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.general.PieDataset;
import org.primefaces.event.map.OverlaySelectEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
import org.primefaces.model.map.DefaultMapModel;
import org.primefaces.model.map.LatLng;
import org.primefaces.model.map.MapModel;
import org.primefaces.model.map.Marker;

import br.senai.sc.controller.Qualidade;
import br.senai.sc.controller.crud.PontoColetaCRUD;
import br.senai.sc.model.Amostra;
import br.senai.sc.model.PontoColeta;
import br.senai.sc.web.pontosColeta.beans.PontosColetaBean;

/**
 * @author Fernando Marquardt &lt;fernando.marquardt@sc.senai.br&gt;
 * @since 02/02/2012
 * @version $Id: PaginaInicialBean.java 47 2012-03-22 20:11:36Z tiago.wanke $
 */
@Named
@SessionScoped
public class PaginaInicialBean implements Serializable {

	private static final long serialVersionUID = 1L;

	@Inject
	private PontosColetaBean pontosColetaBean;

	@Inject
	private PontoColetaCRUD pontoColetaCRUD;

	private Marker marcadorSelecionado;

	private PontoColeta pontoSelecionado;

	private Map<Integer, PontoColeta> pontosColeta = new HashMap<Integer, PontoColeta>();

	private MapModel marcadores;

	private StreamedContent graficoIQA;

	@PostConstruct
	public void inicializar() {

		List<PontoColeta> pontos = pontoColetaCRUD.findPontosColeta();
		for (PontoColeta pontoColeta : pontos) {
			pontosColeta.put(pontoColeta.getIdPontoColeta(), pontoColeta);
		}

	}

	public float[] getCoordenadaCentral() {
		return pontoColetaCRUD.findCoordenadaCentral();
	}

	public MapModel getMarcadoresMapa() {
		if (marcadores == null) {
			marcadores = new DefaultMapModel();

			for (PontoColeta pontoColeta : getPontosColeta()) {
				LatLng coordenada = new LatLng(pontoColeta.getLatitude()
						.doubleValue(), pontoColeta.getLongitude()
						.doubleValue());

				Amostra ultimaAmostra = pontoColetaCRUD
						.findUltimaAmostra(pontoColeta.getIdPontoColeta());
				BigDecimal iqa = ultimaAmostra != null ? ultimaAmostra.getIQA()
						: BigDecimal.ZERO;

				String icon = pontosColetaBean.getIconeMarcador(iqa);

				pontoColeta.setUltimaAmostra(ultimaAmostra);
				marcadores.addOverlay(new Marker(coordenada, pontoColeta
						.getNome(), pontoColeta.getIdPontoColeta(), icon));
			}
		}

		return marcadores;
	}

	public void onSelecionarMarcador(OverlaySelectEvent event) {
		marcadorSelecionado = (Marker) event.getOverlay();

		pontoSelecionado = pontosColeta.get(marcadorSelecionado.getData());
	}

	public List<Amostra> getAmostrasPontoSelecionado() {
		if (pontoSelecionado != null) {
			return pontoColetaCRUD.findUltimasAmostras(pontoSelecionado
					.getIdPontoColeta());
		}

		return null;
	}

	public List<PontoColeta> getPontosColeta() {
		return new ArrayList<PontoColeta>(pontosColeta.values());
	}

	public Marker getMarcadorSelecionado() {
		return marcadorSelecionado;
	}

	public PontoColeta getPontoSelecionado() {
		return pontoSelecionado;
	}

	private PieDataset createDataSet() {
		Map<String, Number> qualidades = new HashMap<String, Number>();
		qualidades.put(Qualidade.ACEITAVEL.name(), 0);
		qualidades.put(Qualidade.BOA.name(), 0);
		qualidades.put(Qualidade.DESCONHECIDA.name(), 0);
		qualidades.put(Qualidade.OTIMA.name(), 0);
		qualidades.put(Qualidade.PESSIMA.name(), 0);
		qualidades.put(Qualidade.RUIM.name(), 0);

		for (PontoColeta ponto : pontoColetaCRUD.findPontosColeta()) {

			Amostra a = pontoColetaCRUD.findUltimaAmostra(ponto
					.getIdPontoColeta());

			if (a != null) {

				String qualidade = a.getQualidade().name();
				qualidades.put(qualidade,
						(Integer) qualidades.get(qualidade) + 1);
			} else { // se nao tiver amostra é desconhecida

				qualidades
						.put(Qualidade.DESCONHECIDA.name(),
								(Integer) qualidades.get(Qualidade.DESCONHECIDA
										.name()) + 1);
			}
		}

		DefaultPieDataset dataSet = new DefaultPieDataset();
		dataSet.setValue(Qualidade.OTIMA.name(),
				qualidades.get(Qualidade.OTIMA.name()));
		dataSet.setValue(Qualidade.BOA.name(),
				qualidades.get(Qualidade.BOA.name()));
		dataSet.setValue(Qualidade.ACEITAVEL.name(),
				qualidades.get(Qualidade.ACEITAVEL.name()));
		dataSet.setValue(Qualidade.RUIM.name(),
				qualidades.get(Qualidade.RUIM.name()));
		dataSet.setValue(Qualidade.PESSIMA.name(),
				qualidades.get(Qualidade.PESSIMA.name()));
		dataSet.setValue(Qualidade.DESCONHECIDA.name(),
				qualidades.get(Qualidade.DESCONHECIDA.name()));

		return dataSet;

	}

	public void createPieChart() {
		try {
			JFreeChart chart = ChartFactory.createPieChart("Notas",
					createDataSet(), true, true, false);

			PiePlot plot = (PiePlot) chart.getPlot();
			plot.setLabelGenerator(new StandardPieSectionLabelGenerator(
					"{0} {2}"));
			plot.setSectionPaint(Qualidade.OTIMA.name(),
					Qualidade.OTIMA.getCor());
			plot.setSectionPaint(Qualidade.BOA.name(), Qualidade.BOA.getCor());
			plot.setSectionPaint(Qualidade.ACEITAVEL.name(),
					Qualidade.ACEITAVEL.getCor());
			plot.setSectionPaint(Qualidade.RUIM.name(), Qualidade.RUIM.getCor());
			plot.setSectionPaint(Qualidade.PESSIMA.name(),
					Qualidade.PESSIMA.getCor());
			plot.setSectionPaint(Qualidade.DESCONHECIDA.name(),
					Qualidade.DESCONHECIDA.getCor());

			ChartRenderingInfo info = new ChartRenderingInfo(
					new StandardEntityCollection());
			File file1 = new File("pieChartIQA");
			final int width = 500;
			final int height = 500;
			ChartUtilities.saveChartAsPNG(file1, chart, width, height, info);
			graficoIQA = new DefaultStreamedContent(new FileInputStream(file1),
					"image/png");

		} catch (IOException e) {
			// TODO tratar exceção de sistema
		}
	}

	public StreamedContent getGraficoIQA() {
		return graficoIQA;
	}

	public void setGraficoIQA(StreamedContent graficoIQA) {
		this.graficoIQA = graficoIQA;
	}

}